package com.ww.learn.coroutine.cancel

import kotlinx.coroutines.*

/**
 * 协程的取消是协作的。一段协程代码必须协作才能被取消。
 * 所有kotlinx.coroutines中的挂起函数都是可被取消的。它们检查协程的取消，并在取消时抛出CancellationException。
 * 然而，如果协程正在执行计算任务，并且没有检查取消的话，那么它是不能被取消的
 */
// 打印结果
//job: I'm sleeping 0 ...
//main: I'm tired of waiting
//job: I'm sleeping 1 ...
//job: I'm sleeping 2 ...
//job: I'm sleeping 3 ...
//job: I'm sleeping 4 ...
//main: Now quit...
fun main() = runBlocking {
    val startTime = System.currentTimeMillis()
    val job = launch(Dispatchers.Default) {
        var nextPrintTime = startTime
        var i = 0
        while (i < 5) { // 一个执行计算的循环，只是为了占用CPU
            if (System.currentTimeMillis() >= nextPrintTime) {
                println("job: I'm sleeping ${i++} ...")
                nextPrintTime += 500L
            }
        }
    }
    com.ww.learn.coroutine.delay(1300L)
    println("main: I'm tired of waiting")
    job.cancelAndJoin()
    println("main: Now quit...")
}